home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 1.iso / HENSA / MISC / SHELL.ARC / Shell / Sources / c / DBarGraph2 < prev    next >
Text File  |  1994-06-25  |  3KB  |  145 lines

  1. #include <stdio.h>
  2.  
  3. #include "DeskLib:WimpSWIs.h"
  4.  
  5. #include "Shell.Extra.h"
  6. #include "Shell.BarGraph.h"
  7. #include "Shell.SafeAlloc.h"
  8.  
  9.  
  10.  
  11. typedef struct    {
  12.     int    spacing;
  13.     int    barwidth;
  14.     int    height;
  15.     double    *data;
  16.     int    numbars;
  17.     int    forecol, backcol;
  18.     double    min, max;
  19.     double    scale;
  20.     int    zeroheight;
  21.     struct    {
  22.         unsigned int    autoscale    : 1;
  23.         }
  24.         flags
  25.         ;
  26.     }
  27.     Shell_dbarinfo2;
  28.  
  29.  
  30.  
  31.  
  32. #define Shell_RecalculateBar( barinfo)    {                            \
  33.     (barinfo)->scale    = (barinfo)->height / ((barinfo)->max - (barinfo)->min);    \
  34.     (barinfo)->zeroheight    = (int) (- (barinfo)->min * (barinfo)->scale);            \
  35.     }                                            \
  36.  
  37. /*
  38. #define MAX( a, b)    ((a) > (b)) ? (a) : (b)
  39. #define MIN( a, b)    ((a) < (b)) ? (a) : (b)
  40. */
  41. /* These are defined in DeskLib:Core.h    */
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49. static void Shell_DoubleBarRedrawer2(
  50.     Shell_convertpoint    convert,
  51.     wimp_point        rectsize,
  52.     void            *reference,
  53.     const wimp_rect        *redrawrect
  54.     )
  55.  
  56. {    Shell_dbarinfo2    *barinfo = (Shell_dbarinfo2 *) reference;
  57.     int        imin, imax, i;
  58.  
  59. imin = MAX( redrawrect->min.x / barinfo->spacing,        0);
  60. imax = MIN( redrawrect->max.x / barinfo->spacing + 1,    barinfo->numbars);
  61.  
  62. if ( barinfo->flags.autoscale)    {
  63.     double    min = barinfo->min, max = barinfo->max;
  64.     for ( i=imin; i<imax; i++)    {
  65.         Shell_MakeGE( max, barinfo->data[i]);
  66.         Shell_MakeLE( min, barinfo->data[i]);
  67.         }
  68.     if ( max != barinfo->max || min != barinfo->min)    {
  69.         barinfo->min = min;
  70.         barinfo->max = max;
  71.         Shell_RecalculateBar( barinfo)
  72.         }
  73.     }
  74.  
  75.  
  76.  
  77. for ( i=imin; i<imax; i++)    {
  78.  
  79.     int y = (int) ( barinfo->data[i] * barinfo->scale + barinfo->zeroheight);
  80.     int x = i*barinfo->spacing;
  81.         int    ymin, ymax;
  82.  
  83.         if ( y < barinfo->zeroheight)    {
  84.             ymin = y;
  85.             ymax = barinfo->zeroheight;
  86.             }
  87.  
  88.         else    {
  89.             ymin = barinfo->zeroheight;
  90.             ymax = y;
  91.             }
  92.  
  93.     Wimp_SetColour( barinfo->forecol);
  94.     Shell_RectangleFill2( x, ymin, x + barinfo->barwidth, ymax, convert);
  95.  
  96.  
  97.     Wimp_SetColour( barinfo->backcol);
  98.     Shell_RectangleFill2( x, 0, x + barinfo->barwidth, ymin, convert);
  99.     Shell_RectangleFill2( x, ymax, x + barinfo->barwidth, rectsize.y, convert);
  100.  
  101.     }
  102.  
  103.  
  104. return;
  105. }
  106.  
  107.  
  108.  
  109.  
  110. Shell_rectblock *Shell_AddDoubleBarGraph2(
  111.     Shell_windblock *wind,
  112.     int x, int y,
  113.     int numbars, int spacing, int barwidth, int maxheight,
  114.     double *data,
  115.     double    min,
  116.     double    max,
  117.     BOOL    autoscale,
  118.     int forecol, int backcol
  119.     )
  120. {
  121.  
  122. Shell_dbarinfo2    *barinfo = (Shell_dbarinfo2 *) Shell_SafeMalloc( sizeof( Shell_dbarinfo2));
  123. Shell_rectblock    *rect;
  124.  
  125. barinfo->spacing        = spacing;
  126. barinfo->barwidth        = barwidth;
  127. barinfo->data            = data;
  128. barinfo->numbars        = numbars;
  129. barinfo->min            = min;
  130. barinfo->max            = max;
  131. barinfo->flags.autoscale    = autoscale;
  132. barinfo->forecol        = forecol;
  133. barinfo->backcol        = backcol;
  134. barinfo->height            = maxheight;
  135.  
  136. Shell_RecalculateBar( barinfo)
  137.  
  138. rect = Shell_AddRectangle3( wind, x, y, spacing*numbars, maxheight, Shell_DoubleBarRedrawer2, barinfo);
  139. Shell_MakeRectIcon( rect, forecol, backcol, "r2");
  140. return rect;
  141. }
  142.  
  143.  
  144.  
  145.